.. _COMI_US_SBPos: COMI_US_SBPos =================== ------------------- SYNOPSYS ````````````` .. code-block:: none UINT COMI_US_SBPos (HANDLE hDevice, int chOrder, ULONG scanCount) DESCRIPTION ````````````` - 이 함수는 원하는 스캔 데이터가 있는 스캔 버퍼의 인덱스(Index)를 계산해줍니다. 스캔 버퍼는 환형 버퍼로 운용되므로 Scan Count 와 버퍼상의 인덱스가 항상 일치하지는 않습니다. 원하는 데이터의 버퍼상 인덱스를 얻기 위해서는 채널 순서와 Scan Count 를 가지고 약간의 조작이 필요한데, COMI_US_SBPos()는 이를 해주는 함수입니다. PARAMETER ````````````` ▶ hDevice : 디바이스 핸들값입니다. 이 값은 COMI_LoadDevice() 함수에 의해 얻어진 값이어야 합니다. ▶ chOrder : 데이터를 취하기 원하는 채널의 채널 리스트 상의 순서 (0 Based)입니다. 이 값은 채널 번호가 아님을 주의하여야 합니다. ▶ scanCount : 원하는 데이터의 Scan Count. RETURN VALUE ````````````` - chOrder 와 ScanCount 에 의해 지정된 데이터의 스캔 버퍼상의 인덱스. Remarks ``````````` - COMI_US_SBPos() 함수의 사용예 : 스캔 채널 배열이 {CH0, CH5} 인 경우, 가장 최근에 Scan 된 100회의 데이터를 취하는 예는 다음과 같이 들 수 있습니다. .. image:: ../../res/Unlimited-1.jpg Device ````````````` - 지원 디바이스: COMI-CP101, COMI-CP201, COMI-SD101, COMI-SD102, COMI-SD103, COMI-SD104, COMI-SD201 EXAMPLE ``````````` .. code-block:: c++ :linenos: :emphasize-lines: 5 /********************************************************************************** /* [COMIDAS sample program by COMIZOA Inc., Ltd] /* /* - Subject : Unlimited Scan /* - Contents : 이 프로그램은 A/D CH0 와 CH4의 두 채널을 Unlimited scan 을 이용하여 A/D Convert를 하고 /* 그 결과를 파일로 저장하는 예제입니다. 이 프로그램에서는 Scan 버퍼를 직접 /* handling 하는 방법을 보여주고 있습니다. /* - Remarks : /* 1. 이 예제는 COMI-CP101 보드를 사용하는 것으로 작성되었습니다. /* 사용하는 경우에는 COMI_LoadDevice(...) 함수의 첫 번째 파라미터를 알맞은 /* 디바이스 ID로 바꾸어야 합니다. /**********************************************************************************/ #include #include #include #include "Comidas.h" #define NUM_CH 2 /*Number of Channels*/ #define S_FREQ 1000 /*Scan freq. -> 1000Hz*/ #define MSB 40960 /*Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정하는데*/ /*1024의 배수로 지정하는 것이 좋다.*/ void main (void) { HANDLE hDevice; int ch_list[2] = {0, 4}; /*Scan channel list : 0번 과 4번 채널*/ FILE *fq; short *pScanBuf; ULONG c, prv_cnt, cur_cnt; UINT idx1, idx2; /*Load DLL*/ if(!COMI_LoadDll){ printf("Comidas.dll load failure"); exit(0); } /*Load Device*/ hDevice = COMI_LoadDevoce (COMI_CP101, 0); if(hDevice == INVALID_HANDLE_VALUE){ printf("Can't load specified device!"); COMI_UnloadDll(); exit(0); } /*start unlimited scan*/ long act_freq = COMI_US_Start (hDevice, NUM_CH, ch_list, S_FREQ, MSB, TRS_SINGLE) if(act_freq < 0){ /*Error 처리*/ COMI_ErrorString (COMI_LastError()); COMI_UnloadDevice(hDevice); COMI_UnloadDll(); exit(0); } /*Create a file to save data*/ fp = fopen("c:\\ComiUscan.tst", "w"); fprintf(fp, "CH0 CH4\n"); printf("Unlimited scan has started !\nPress any key to quit"); pScanBuf = COMI_US_GetBufPtr(hDevice); // Get scan buffer pointer prv_cnt = 0; // initizalize count variable while(!_kbhit()){ cur_cnt = COMI_US_CurCount (hDevice); /*prv_cnt : end count of previously processed data block */ /*prv_cnt+1 : initial count of newly scand data block */ /*cur_cnt : end count of current newly scanned data block */ for(c = prv_cnt+1; c <= cur_cnt; c++) { /*COMI_US_SBPos (..)함수를 이용하여 각 채널의 버퍼상 인덱스를 얻는다.*/ /*이때 두번쨰 파라미터는 채널번호가 아니라 채널 리스트상의 순서이다.*/ /*즉, CH0 는 0이고, CH4 는 1 이된다.*/ idx1 = COMI_US_SBPos (hDevice, 0, c); idx2 = COMI_US_SBPos (hDevice, 1, c); /*File 에 데이터를 저장한다. 아래의 코드는 Voltage 값으로 저장하는*/ /*것이 아니고 정수값으로 저장된다. 이를 Voltage 값으로 환산해서*/ /*저장하려면 아래의 주석처리된 코드를 이용하면 된다.*/ /*(단, COMI_SD201 보든느 COMI_Digit16ToVolt()를 이용해야 한다.)*/ // float ch0_volt, ch4_volt; // ch0_volt = COMI_DigitToVolt (pScanBuf[idx1], -10, 10); // ch4_volt = COMI_DigitToVolt (pScanBuf[idx2], -10, 10); // fprintf(fp, "%6.2f %6.2f\n", ch0_volt, ch4_volt); fprintf(fp, "%6d %6d\n") } prv_cnt = cur_cnt; } COMI_US_Stop(hDevice, TRUE); fclose(fp); COMI_UnloadDevice(hDevice); COMI_UnloadDll; }